/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ec.edu.espe.distribuidas.ejemplomaven.web;

import ec.edu.espe.distribuidas.aseguradora.modelo.CuentaSiniestro;
import ec.edu.espe.distribuidas.aseguradora.modelo.DetCuentaSiniestro;
import ec.edu.espe.distribuidas.aseguradora.modelo.Siniestro;
import ec.edu.espe.distribuidas.aseguradora.servicio.CuentaSiniestroServicio;
import ec.edu.espe.distribuidas.aseguradora.servicio.DetCuentaSiniestroServicio;
import ec.edu.espe.distribuidas.aseguradora.servicio.SiniestroServicio;
import ec.edu.espe.distribuidas.aseguradora.web.util.BotonesBean;
import ec.edu.espe.distribuidas.aseguradora.web.util.MensajesGenericos;
import java.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import org.apache.commons.beanutils.BeanUtils;

/**
 *
 * @author pacodell
 */
@ManagedBean
@ViewScoped
public class FacturaBean extends BotonesBean{
      private static final String ENTIDAD = "DetcuentaSiniestro";
    @EJB
    private DetCuentaSiniestroServicio detalleSinServicio;
    @EJB
    private CuentaSiniestroServicio cuentaSiniestroServicio;
    @EJB
    private SiniestroServicio siniestroServicio;
    private Siniestro siniestro;
    private List<Siniestro> siniestros;
    private CuentaSiniestro cuenta;
    private List<DetCuentaSiniestro> detalles;
    private DetCuentaSiniestro detalle;
    private DetCuentaSiniestro detalleSeleccionado;
    private SimpleDateFormat formated = new SimpleDateFormat("yyyy-mm-dd");
    private String fecha;
    private Boolean nuevoDet;
    private Boolean editarDet;
    private Double subTotal;
    private Double IVA;
    private String codTemp;
    
     @PostConstruct
    @Override
    public void postConstructor(){
        super.sinSeleccion();
       
        this.cuenta=new CuentaSiniestro();
        this.nuevoDet=Boolean.FALSE;
        this.editarDet=Boolean.FALSE;
        this.subTotal=Double.parseDouble("0");
        this.IVA=Double.parseDouble("0");
        this.siniestros= this.siniestroServicio.ObtenerCreados();
        this.siniestros.addAll(this.siniestroServicio.ObtenerPendientes());
        this.siniestro=new Siniestro();
        this.codTemp="";
    }
    private void calcular()
    {
        this.subTotal=Double.parseDouble("0");
        this.IVA=Double.parseDouble("0");
        for(DetCuentaSiniestro det :detalles)
        {
        this.subTotal=this.subTotal+det.getTotalProducto();
        }
        this.IVA=subTotal*Double.parseDouble("0.12");
        this.cuenta.setTotalSin(subTotal+IVA);
    }
    
    public void filaSeleccionada(ActionEvent evento) {
        if (detalleSeleccionado instanceof DetCuentaSiniestro) {
           // super.seleccionadoUno();
            super.setUno(Boolean.TRUE);
        } else {
            super.sinSeleccion();
        }
    }
    
    public void nuevo(){
        super.crear();
        this.detalle=new DetCuentaSiniestro();
        this.detalle.setCodCuentaSieniestro(cuenta);
        this.nuevoDet=Boolean.TRUE;
    }
    public void editando(){
        
          try {
              
            super.crear();
           this.detalle=new DetCuentaSiniestro();
              BeanUtils.copyProperties(this.detalle, this.detalleSeleccionado);         
            this.nuevoDet=Boolean.TRUE;
            this.editarDet=Boolean.TRUE;
          } catch (IllegalAccessException ex) {
              Logger.getLogger(FacturaBean.class.getName()).log(Level.SEVERE, null, ex);
          } catch (InvocationTargetException ex) {
              Logger.getLogger(FacturaBean.class.getName()).log(Level.SEVERE, null, ex);
          }
      
         
    }
    public void nuevoDetalle()
    {
      try {
          if(!this.editarDet)
          {
          this.detalle.setTotalProducto(this.detalle.getCantidadDet()*this.detalle.getValorUnitario());
          this.detalleSinServicio.crear(this.detalle);
        this.nuevoDet=Boolean.FALSE;
        super.setEnEdicion(Boolean.TRUE);
        this.detalles.add(this.detalle);
        this.subTotal=this.subTotal+(this.detalle.getCantidadDet()*this.detalle.getValorUnitario());
        this.cuenta.getDetCuentaSiniestroList().add(detalle);
        this.IVA=subTotal*Double.parseDouble("0.12");
        this.cuenta.setTotalSin(subTotal+IVA);
          }
          else{
           this.detalle.setTotalProducto(this.detalle.getCantidadDet()*this.detalle.getValorUnitario());
          this.detalleSinServicio.modificar(this.detalle);
          this.detalles=this.detalleSinServicio.ObtenerCuentaDetalle(""+this.detalle.getCodCuentaSieniestro().getCodCuentaSieniestro());
          this.nuevoDet=Boolean.FALSE;
          super.setEnEdicion(Boolean.TRUE);
          this.editarDet=Boolean.FALSE;
          this.calcular();
          }
          } catch (Exception e) {
            MensajesGenericos.errorGuardar();
        }
    }
    
    public void cargarTabla(){
        this.detalles=this.detalleSinServicio.obtenerTodas();
    }
    
    public void modificar(){
        //super.modificar();
        
        try {
            this.detalle = new DetCuentaSiniestro();
            BeanUtils.copyProperties(this.detalle, this.detalleSeleccionado);
            super.modificar();
            
        } catch (Exception e) {
            MensajesGenericos.errorCopyProperties();
        }
        //this.detalles=this.detalleSinServicio.obtenerTodos();
        
    }
    
    public void eliminar(){
        this.detalleSinServicio.eliminar(""+this.detalleSeleccionado.getCodDetalle());
        this.detalles.remove(this.detalleSeleccionado);
        
        MensajesGenericos.infoEliminar(ENTIDAD, ""+this.detalleSeleccionado.getCodDetalle(), Boolean.TRUE);
        super.sinSeleccion();
        super.setEnEdicion(Boolean.TRUE);
        this.calcular();
        
    }
    
    public void guardar(){
        try {
          //  this.cuenta=new CuentaSiniestro();
            cuenta.setCodSiniestro(this.siniestroServicio.buscarPorCodigo(codTemp));
            cuenta.setFechaFac(formated.parse(this.fecha));
            cuenta.setTotalSin(Double.parseDouble("0"));
            this.cuentaSiniestroServicio.crear(this.cuenta);
        super.setEnEdicion(Boolean.TRUE);
            
        this.detalles=this.detalleSinServicio.ObtenerCuentaDetalle(cuenta.getCodCuentaSieniestro().toString());
               // this.detalles.add(this.detalle);
                
                MensajesGenericos.infoCrear(ENTIDAD,""+this.cuenta.getCodCuentaSieniestro(), Boolean.TRUE);
                super.setEnEdicion(Boolean.TRUE);
          this.detalles=this.detalleSinServicio.ObtenerCuentaDetalle(cuenta.getCodCuentaSieniestro().toString());
        } catch (Exception e) {
            MensajesGenericos.errorGuardar();
        }
        
        
    }
    
    public void cancelar(){
        if (super.getEnRegistro()) {
            super.sinSeleccion();
        } else {
            super.seleccionadoUno();
        }
        MensajesGenericos.infoCancelar();
    }

        public String guardarFactura()
        {
             try {
            this.cuentaSiniestroServicio.modificar(cuenta);
           // this.siniestro.getCuentaSiniestroList().add(cuenta);
            this.siniestro=cuenta.getCodSiniestro();
            this.siniestro.setEstadoReclamo("Pendiente");
            this.siniestroServicio.modificar(siniestro);
        } catch (Exception e) {
            MensajesGenericos.errorCopyProperties();
        }
            return "inicio.jsf";
        }
        public String cancelarFactura()
        {
             for(DetCuentaSiniestro det :detalles)
        {
        this.detalleSinServicio.eliminar(""+det.getCodDetalle());
        }
            this.cuentaSiniestroServicio.eliminar(""+cuenta.getCodCuentaSieniestro());
            
           return "inicio.jsf"; 
        }
    public DetCuentaSiniestroServicio getDetalleSinServicio() {
        return detalleSinServicio;
    }

    public void setDetalleSinServicio(DetCuentaSiniestroServicio detalleSinServicio) {
        this.detalleSinServicio = detalleSinServicio;
    }

    public CuentaSiniestroServicio getCuentaSiniestroServicio() {
        return cuentaSiniestroServicio;
    }

    public void setCuentaSiniestroServicio(CuentaSiniestroServicio cuentaSiniestroServicio) {
        this.cuentaSiniestroServicio = cuentaSiniestroServicio;
    }

    public SiniestroServicio getSiniestroServicio() {
        return siniestroServicio;
    }

    public void setSiniestroServicio(SiniestroServicio siniestroServicio) {
        this.siniestroServicio = siniestroServicio;
    }

    public Siniestro getSiniestro() {
        return siniestro;
    }

    public void setSiniestro(Siniestro siniestro) {
        this.siniestro = siniestro;
    }

    public List<DetCuentaSiniestro> getDetalles() {
        return detalles;
    }

    public void setDetalles(List<DetCuentaSiniestro> detalles) {
        this.detalles = detalles;
    }

    public DetCuentaSiniestro getDetalle() {
        return detalle;
    }

    public void setDetalle(DetCuentaSiniestro detalle) {
        this.detalle = detalle;
    }

    public DetCuentaSiniestro getDetalleSeleccionado() {
        return detalleSeleccionado;
    }

    public void setDetalleSeleccionado(DetCuentaSiniestro detalleSeleccionado) {
        this.detalleSeleccionado = detalleSeleccionado;
    }

    public CuentaSiniestro getCuenta() {
        return cuenta;
    }

    public void setCuenta(CuentaSiniestro cuenta) {
        this.cuenta = cuenta;
    }

    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    public Boolean getNuevoDet() {
        return nuevoDet;
    }

    public void setNuevoDet(Boolean nuevoDet) {
        this.nuevoDet = nuevoDet;
    }

    public Double getSubTotal() {
        return subTotal;
    }

    public void setSubTotal(Double subTotal) {
        this.subTotal = subTotal;
    }

    public Double getIVA() {
        return IVA;
    }

    public void setIVA(Double IVA) {
        this.IVA = IVA;
    }

    public Boolean getEditarDet() {
        return editarDet;
    }

    public void setEditarDet(Boolean editarDet) {
        this.editarDet = editarDet;
    }

    public List<Siniestro> getSiniestros() {
        return siniestros;
    }

    public void setSiniestros(List<Siniestro> siniestros) {
        this.siniestros = siniestros;
    }

    public String getCodTemp() {
        return codTemp;
    }

    public void setCodTemp(String codTemp) {
        this.codTemp = codTemp;
    }

   

  
    
    
}
